import random
import re
from datetime import datetime

from flask import request, abort, current_app, make_response, json, jsonify, session

from info import redis_store, constants, db
from info.libs.yuntongxun.sms import CCP
from info.models import User
from info.utils.response_code import RET
from . import passport_blu

from info.utils.captcha.captcha import captcha

@passport_blu.route("/logout")
def logout():
    '''
    退出登录
        删除session值
    :return:
    '''

    session.pop("user_id",None)
    session.pop("mobile",None)
    session.pop("nick_name",None)

    return jsonify(errno=RET.OK,errmsg="退出成功")


@passport_blu.route("/login",methods=["POST"])
def login():
    '''
        获取参数
        校验参数
        校验密码是否正确
        保存用户登录状态
        相应

    :return:
    '''
    params_dict = request.json
    mobile = params_dict.get("mobile")
    passport= params_dict.get("passport")


    if not all([mobile,passport]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")

        # 校验手机号是否正确
    if not re.match('1[35678]\\d{9}', mobile):
        return jsonify(error=RET.PARAMERR, errmasg="手机号格式不正确")

    try:
        user = User.query.filter(User.mobile == mobile).first()

    except Exception as e :
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据查询错误")

    if not user:
        return jsonify(errno=RET.NODATA,errmsg="用户不存在")

    if not user.check_passowrd(passport):
        return jsonify(errno=RET.PARAMERR,errmsg="用户名或者密码错误")

    session["user_id"] = user.id
    session["nick_name"] = user.nick_name
    session["mobile"] = user.mobile
    # 用户最后登录时间
    user.last_login = datetime.now()

    # try:
    #     db.session.commit()
    # except Exception as e:
    #     db.session.rollback()
    #     current_app.logger.error(e)


    return jsonify(errno=RET.OK,errmsg="登录成功")


@passport_blu.route("/sms_code",methods=["POST"])
def send_sms_code():
    '''
        1、发送短信
            获取参数：手机号、图片验证码、图片验证码编号
            校验参数：
            从redis取出验证码
            对比和用户输入的是否相等
            如果一致生成验证码
            发送短信
            告知发送结果


    :return:
    '''

    # json.loads(request.data)

    params_dict = request.json
    mobile  = params_dict.get("mobile")
    image_code = params_dict.get("image_code")
    image_code_id = params_dict.get("image_code_id")
    # 判断参数是否有值
    if not all([mobile,image_code_id,image_code]):
        return jsonify(error=RET.PARAMERR,errmasg="参数有误")
    # 校验手机号是否正确
    if not re.match('1[35678]\\d{9}',mobile):
        return jsonify(error=RET.PARAMERR, errmasg="手机号格式不正确")
    #   从redis中取出真实的验证码内容
    try:
        real_image_code = redis_store.get("ImageCodeId"+image_code_id)
        print(real_image_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据查询失败")
    # 判断验证码是否过期
    if not real_image_code:
        return jsonify(errno=RET.NODATA,errmsg="图片验证码已过期")
    # 与用户的验证码内容进行对比，不一致返回验证码输入错误
    if real_image_code.upper() != image_code.upper():
        return jsonify(errno=RET.DATAERR,errmsg="验证码输入错误")

    # 随机数字，保证数字的长度6位
    sms_code_str = "%06d" %random.randint(0,999999)
    print(sms_code_str)
    print(mobile,sms_code_str,[constants.SMS_CODE_REDIS_EXPIRES/5])
    # 发送短信验证码
    # CCP.send_template_sms()
    # result= CCP().send_template_sms(mobile,[sms_code_str,int(constants.SMS_CODE_REDIS_EXPIRES/60)],1)
    # if result != 0:
    #     return  jsonify(errno=RET.THIRDERR,errmsg="发送短信失败")

    # 保存短信验证码到redis中
    try:
        redis_store.set("SMS_"+mobile,sms_code_str,constants.SMS_CODE_REDIS_EXPIRES)
    except Exception as e :
        current_app.logger.error(e)
        return  jsonify(errno=RET.DBERR,errmsg="数据保存失败")

    # 返回发送结果
    return jsonify(errno=RET.OK,errmsg="发送成功")


@passport_blu.route("/image_code")
def get_image_code():
    '''
        1、取到参数
        2、判断参数是否有值
        3、生成图片验证码
        4、保存图片验证文字到redis
        5、返回验证码图片

    '''

    image_code_id = request.args.get('imageCodeId',None)
    if not image_code_id:
        return abort(403)

    name,text,image = captcha.generate_captcha()
    print(text)


    try:
        redis_store.set("ImageCodeId"+image_code_id,text,constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        print(e)
        current_app.logger.error(e)
        abort(500)

    #     设置数据类型，以便浏览器智能识别返回数据
    response = make_response(image)
    response.headers["Content-Type"] = "image/jpg"

    return response

@passport_blu.route("/register",methods=["POST"])
def register():
    '''
    获取参数
    校验参数
    取到服务器保存的真实短信验证码内容
    校验用户输入短信验证码内容和真实验证码内容是否一致
    如果一致 初始化USer模型。斌切复制
    将user模型添加到数据库
    返回响应

    :return:
    '''

    param_dict = request.json
    mobile = param_dict.get("mobile")
    smscode = param_dict.get("smscode")
    password = param_dict.get('password')

    if not all([mobile,smscode,password]):
        return jsonify(errno = RET.PARAMERR ,errmsg="参数错误")

    try:
        real_sms_code = redis_store.get('SMS_'+mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据查询错误")

    if not real_sms_code:
        return jsonify(errno=RET.NODATA,errmsg="验证码已过期")

    if real_sms_code != smscode :
        return jsonify(errno=RET.DATAERR, errmsg="验证码输入错误")

    user = User()
    user.mobile = mobile,
    user.nick_name = mobile,
    user.last_login = datetime.now()
    user.password = password

    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e :
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg="数据保存失败")
    session["user_id"] = user.id
    session["nick_name"] = user.nick_name
    session["mobile"] = user.mobile
    return jsonify(errno=RET.OK,errmsg="注册成功")

